#Requires AutoHotkey v2.0

; 数字转换为中文数字表示的函数
NumToChinese(num) {
    
    ; 0 返回 "零"
    if(num == 0){
        return "零"
    }

    ; 映射表，中文数字
    baseNum := []

    baseNum.Push("一")
    baseNum.Push("二")
    baseNum.Push("三")
    baseNum.Push("四")
    baseNum.Push("五")
    baseNum.Push("六")
    baseNum.Push("七")
    baseNum.Push("八")
    baseNum.Push("九")
    baseNum.Push("十")
    baseNum.Push("十一")
    baseNum.Push("十二")
    baseNum.Push("十三")
    baseNum.Push("十四")
    baseNum.Push("十五")
    baseNum.Push("十六")
    baseNum.Push("十七")
    baseNum.Push("十八")
    baseNum.Push("十九")
    
    ; 映射表，中文数位
    large := []

    large.push("")
    large.Push("十")
    large.push("百")
    large.push("千")
    large.push("万")
    large.push("十万")
    large.push("百万")
    large.push("千万")
    large.push("亿")
    large.push("十亿")
    large.push("百亿")
    large.push("千亿")
    large.push("万亿")

    ; 检查数字是否在映射表中
    loop baseNum.Length{
        if(num == A_Index){
            return baseNum[A_Index]
        }
    }
    
    ; 将数字的各个位的字符从低到高存入数组
    arr := NumberToArray(num) 
    str := "" ; 存储字符串

    loop arr.Length{

        temp := +arr[A_Index] ; 字符串格式转成数字格式
        temp := NumToChinese(temp) ; 根据映射表转换为中文

        if(temp != "零"){ ;0不需要加数位
            temp := temp large[A_Index] ; 加上数位
        }
        str := temp str ; 连接字符串(加在前面)
        
    }
    
    ;去除多余的零
    removeZero := false ; 判断是否删除多余的零
    loop parse str{
        if(A_LoopField == "零"){

            ; 最后一个字是零，去掉它
            if(A_Index == StrLen(str)){
                str := StrReplace(str, "零", "")
                break
            }
            
            ; 零后面有零，去掉(只保留一个零)
            if(SubStr(str, 1, A_Index) == "零"){
                str := StrReplace(str, "零", "")
                continue
            }
        }
    }

    return str
}


; 将数字的各个位的字符从低到高存入数组的函数
NumberToArray(number) {
    arr1 := []
    arr2 := []
    
    ; 将数字转换为字符串
    str := Format("{:d}", number)
    ; 遍历字符串的每个字符
    Loop Parse, str {
        arr1.Push(A_LoopField)
    }
    
    index := arr1.Length
    Loop arr1.Length{
        arr2.Push(arr1[index--])
    }
    return arr2
}

; 中文形式表示数字转换为阿拉伯数字表达形式
ChineseToNum(str){
    return ChNum._ChToNum(str)
}

class ChNum {

    

    static baseNum := [
        "一", "二", "三", "四", "五", "六", "七", "八", "九", "十",
        "十一", "十二", "十三", "十四", "十五", "十六", "十七", "十八", "十九"
    ]
    
    static large := [
        "", "十", "百", "千", "万", "十万", "百万", "千万", "亿", 
        "十亿", "百亿", "千亿", "万亿"
    ]

    static _ChToNum(str){

        ; "零" 返回 0
        if(str == "零"){
            return 0
        }
        
        ; 检查数字是否在映射表中
        loop this.baseNum.Length{
            if(str == this.baseNum[A_Index]){
                return A_Index
            }
        }

        strTemp := str
        num := 0
    
        ; 添加数值和数位(从最高为开始添加)
        loop this.large.Length{
            i := this.large.Length - A_Index + 1 ; 从后往前数
	        ; MsgBox i "-" A_index
	        if( i < 1){
	            break
	        }
            
            
            try{
                postion := InStr(strTemp, this.large[i]) ; 数位出现的位置
                ;MsgBox(large[i] "---" postion)
            } catch as e{
                ; this.large[1] := ""  是一个空字符串
                ; InStr(aystack, Needle)  如果Needle是空字符串就会报异常
                MsgBox(strTemp)

                ;if(SubStr = ""){
                ;    break
                ;}

                ;numN := this._ChToNum(SubStr(strTemp,-1)) ;个位数
                ;MsgBox(numN "-----" strTemp)
                ;num := num + numN
                
            }
            
            
            if(postion != 0){ ; 如果出现了，算出它的值
                ; postion := postion - 1 ;
                numN := this._ChToNum(SubStr(strTemp,1,postion - 1))
                num := num + (10 ** (i-1) * numN)
                

                strTemp := SubStr(strTemp, postion + 1)
            }
        }

        return num
    }

}